/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.com.poligran.polla.mundialista.ingesoft.dao;

import co.com.poligran.polla.mundialista.ingesoft.base.Usuario;
import static co.com.poligran.polla.mundialista.ingesoft.dao.Conexion.conexionSqlServer;


import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import java.util.LinkedList;
import javax.swing.JOptionPane;

/**
 *
 * @author DAVID MOTTA
 */
public class SqlServerUsuarioDAO implements UsuarioDAO{

    
    /**
     * 
     * @param conexion
     * @param usuario
     * @param contrasenia
     * @return informacion del usuario que realizo el LOG_IN
     * @throws Exception 
     * @author gab
     * BEGIN
     * @comment yo manejaria el Log-in de esta forma
     * Esta funcion llama al procedimiento almacenado que valida si el usuario se puede logear
     */
    
  

    public  Usuario GetByLogin (Connection conexion, String usuario, String contrasenia)throws Exception{
        Usuario tUsuario = null;
        try{
            CallableStatement statement = (CallableStatement)conexion.prepareCall("EXEC sp_GetUsuarioContrasenia_2 ?,?");
            
            statement.setString("inNombreUsuario", usuario);
            statement.setString("inContrasenia", contrasenia);
            
            ResultSet resultSet = statement.executeQuery();
            
            if(resultSet.next()){
                tUsuario = new Usuario(
                        resultSet.getInt("idUsuario"),
                        resultSet.getString("cedulaUsuario"), 
                        resultSet.getString("nombreUsuario"), 
                        resultSet.getString("apellidoUsuario"), 
                        resultSet.getString("nickName"), 
                        resultSet.getString("correoElectronico"), 
                        resultSet.getString("contrasena"),
                        resultSet.getDate("fechaCreacion"),
                        resultSet.getString("numCuentaPSE")
                        
                        );
            }
        }
        catch(Exception ex){
            System.out.print("exepction  "+ex.getMessage());
            throw new Exception(ex.getMessage());
            
            
        }
        finally{
            return tUsuario;
        }
    }
    
    /**
     * 
     * @param usuario
     * @param contrasenia
     * @return existencia del usuario
     * Este es la funcion que permite el Login de un usuario
     */
    
    public  boolean Login(String usuario, String contrasenia){
        
        boolean existeUsuario = false;
        Connection conexion = conexionSqlServer();
        
        try{
        
           conexion.setAutoCommit(false);
           Usuario tUsuario = GetByLogin(conexion, usuario, contrasenia);
            
            if(tUsuario != null){
        
                existeUsuario = true;
            }
            
            conexion.commit();
        
        }
        catch(Exception ex){
            
            conexion.rollback();
            JOptionPane.showMessageDialog(null, ex.getMessage());
        
        }
        finally{
            
            return existeUsuario;
        }
    }
    
    
    /**
     * 
     * @author gab
     * END
    */
    
    
    
    
    
    
    @Override
    public Collection selectUsuario() {
        Usuario usuario = null;
        Conexion conexion = null;
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs= null;
        LinkedList selectUsuarios = null;
        StringBuilder sqlConsulta = new StringBuilder();
        try {
            conn = conexion.conexionSqlServer(); 
            sqlConsulta.append("select * from usuario");
            ps = conn.prepareStatement(sqlConsulta.toString() ,ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            rs = ps.executeQuery();
            selectUsuarios = new LinkedList();
            while(rs.next()){
                usuario = new Usuario();
                
                usuario.setIdentificacion(rs.getString(1));
                usuario.setNombre(rs.getString(2));
                usuario.setApellido(rs.getString(3));
                usuario.setNombreUsuario(rs.getString(4));
                usuario.setCorreoElectronico(rs.getString(5));
                usuario.setContrasena(rs.getString(6));
                usuario.setFecCreacion(rs.getDate(7));
                usuario.setNumCuentaPSE(rs.getString(8));
                
                selectUsuarios.add(usuario);
            }
            
        }
        catch( SQLException sqle) {
            sqle.printStackTrace();
            System.out.println(sqle.getMessage());
            
        }
        finally {
            try {
                if (rs!=null) {
                    rs.close();
                }
            }
            catch (SQLException sqlers) {
                sqlers.printStackTrace();
                System.out.println("Resultset:");
                System.out.println(sqlers.getMessage());
            }
            try {
                if (ps!=null) {
                    ps.close();
                }
            }
            catch (SQLException sqleps) {
                sqleps.printStackTrace();
                System.out.println("PreparedStatement:");
                System.out.println(sqleps.getMessage());
            }
            try {
                if (conn!=null && !conn.isClosed()) {
                    conn.close();
                }
            }
            catch (SQLException sqleCon) {
                sqleCon.printStackTrace();
                System.out.println("Connection:");
                System.out.println(sqleCon.getMessage());
            }
        }
    
        return selectUsuarios;        
    }

    //datos insert
     public static void InsertAll(Connection conexion, Usuario usuario) throws Exception
    {
 
        try
        {
            CallableStatement statement=(CallableStatement) conexion.prepareCall("EXEC [dbo].[sp_InsertUsuario] ?,?,?,?,?,? ");
        
            
            statement.setString("cedulaUsuario", usuario.getIdentificacion());
            statement.setString("nombreUsuario", usuario.getNombre());
            statement.setString("apellidoUsuario", usuario.getApellido());
            statement.setString("nickName", usuario.getNombreUsuario());
            statement.setString("correoElectronico", usuario.getCorreoElectronico());
            statement.setString("contrasena", usuario.getContrasena());
            /*
             * @nombreUsuario = N'gab ',
		@apellidoUsuario = N'ort',
		@nickName = N'gab',
		@correoElectronico = N'gabriel.o@gmail.com',
		@contrasena = N'gab'
             * 
             */
            statement.execute();
        }
        catch(Exception ex)
        {
            throw new Exception(ex.getMessage());
        }
    }
    
    //negocio Insert
    public  boolean InsertAll(Usuario usuario)
    {
        boolean estadoOrdenSql = false;
        Connection conexion = conexionSqlServer();
        
        try
        {
            conexion.setAutoCommit(false);
            
           SqlServerUsuarioDAO.InsertAll(conexion, usuario);
           //ahora si intente poorfavor
            estadoOrdenSql=true;
            
            conexion.commit();
        }
        catch(Exception ex)
        {
            conexion.rollback();
            JOptionPane.showMessageDialog(null, ex.getMessage());
        }
        finally
        {
            return estadoOrdenSql;
        }
    }
    
    
    @Override
    public boolean insertUsuario(Usuario usuario) {
         
         boolean inserto = false;
         Connection conexion = conexionSqlServer();
        try{
            CallableStatement statement = (CallableStatement)conexion.prepareCall("EXEC sp_InsertUsuario ?,?,?,?,?,?");
            
            statement.setString("identificacion", usuario.getIdentificacion());
            statement.setString("nombre", usuario.getNombre());
            statement.setString("apellidos", usuario.getApellido());
            statement.setString("nombreUsuario", usuario.getNombreUsuario());
            statement.setString("correoElectronico", usuario.getCorreoElectronico());
            statement.setString("contrasenia", usuario.getContrasena());
                        
            statement.executeUpdate();
            
            inserto = true;
                 
           }
        catch(Exception ex){
            System.out.print("exepction  "+ex.getMessage());
            throw new Exception(ex.getMessage());
            
            
        }
        finally{
            return inserto;
        }
    }

    @Override
    public boolean updateUsuario(Usuario usuario) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
    
}
